From 0d99131f9d714f4ac7504c1c5edb6e09577519ae Mon Sep 17 00:00:00 2001 From: Igor Mammedov Date: Mon, 16 May 2011 13:29:24 +0100 Subject: [PATCH] VT-d: Fix resource leaks on error paths On error exit from functions, maped pages should be unmapped and acquired locks released. Signed-off-by: Igor Mammedov Acked-by: Allen Kay --- xen/drivers/passthrough/vtd/intremap.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/xen/drivers/passthrough/vtd/intremap.c b/xen/drivers/passthrough/vtd/intremap.c index 09af71f8f3..36a8f7b0dc 100644 --- a/xen/drivers/passthrough/vtd/intremap.c +++ b/xen/drivers/passthrough/vtd/intremap.c @@ -210,7 +210,8 @@ static int alloc_remap_entry(struct iommu *iommu) if ( iremap_entries ) unmap_vtd_domain_page(iremap_entries); - ir_ctrl->iremap_num++; + if ( i < IREMAP_ENTRY_NR ) + ir_ctrl->iremap_num++; return i; } @@ -246,6 +247,8 @@ static int remap_entry_to_ioapic_rte( dprintk(XENLOG_ERR VTDPREFIX, "%s: index (%d) get an empty entry!\n", __func__, index); + unmap_vtd_domain_page(iremap_entries); + spin_unlock_irqrestore(&ir_ctrl->iremap_lock, flags); return -EFAULT; } @@ -281,7 +284,8 @@ static int ioapic_rte_to_remap_entry(struct iommu *iommu, if ( index < 0 ) { index = alloc_remap_entry(iommu); - apic_pin_2_ir_idx[apic][ioapic_pin] = index; + if ( index < IREMAP_ENTRY_NR ) + apic_pin_2_ir_idx[apic][ioapic_pin] = index; } if ( index > IREMAP_ENTRY_NR - 1 ) @@ -546,6 +550,8 @@ static int remap_entry_to_msi_msg( dprintk(XENLOG_ERR VTDPREFIX, "%s: index (%d) get an empty entry!\n", __func__, index); + unmap_vtd_domain_page(iremap_entries); + spin_unlock_irqrestore(&ir_ctrl->iremap_lock, flags); return -EFAULT; } -- 2.30.2